package com.example.myletcodelearing.one

import java.util.*


/**
 * @author tgw
 * @date 2022/11/7
 * https://leetcode.cn/problems/valid-parentheses/comments/
给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。

有效字符串需满足：

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
 

示例 1：

输入：s = "()"
输出：true
示例 2：

输入：s = "()[]{}"
输出：true
示例 3：

输入：s = "(]"
输出：false



 */

fun main(args: Array<String>) {
    var op = Solution25.Solution()
    var num = 5
    var result = op.generateParenthesis(num)


    print("打印：$result")
    var result1=ArrayList<String> ()
//    result1.add("0")
//    for (i in result1){
//        result1.remove(i)
//    }
    val iterator1: Iterator<String> = result1.iterator()
    while (iterator1.hasNext()) {
        println(iterator1.next())
        result1.add("iterator1.next()")
    }
}

private class Solution25 {
    internal class Solution {

        fun generateParenthesis(n: Int): List<String> {

            var list = ArrayList<String>()
            if (n==0){
                return list
            }
            var list1 = ArrayList<ArrayList<String>>()
            list1.add(ArrayList<String>().apply { add("") })
            list1.add(ArrayList<String>().apply { add("()") })
            for (i in 2 until n){
                var list2 = ArrayList<ArrayList<String>>()
                for (j in list1){
                    var list21 = ArrayList<String>()
                    for (k in j){

                    }
                }
            }

            return list
        }

        fun generateParenthesis2(n: Int): List<String>? {
            val result = LinkedList<LinkedList<String>>()
            if (n == 0) return result[0]
            val list0 = LinkedList<String>()
            list0.add("")
            result.add(list0)
            val list1 = LinkedList<String>()
            list1.add("()")
            result.add(list1)
            for (i in 2..n) {
                val temp = LinkedList<String>()
                for (j in 0 until i) {
                    val str1: List<String> = result[j]
                    val str2: List<String> = result[i - 1 - j]
                    for (s1 in str1) {
                        for (s2 in str2) {
                            val el = "($s1)$s2"
                            temp.add(el)
                        }
                    }
                }
                result.add(temp)
            }
            return result[n]
        }
    }


}
